SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
Celery
Eine asynchrone Task Queue
   (nicht nur) für Django
       Markus Zapke-Gründemann
             www.keimlink.de
  Leipzig Python User Group 12.10.2010
Überblick
• Warum eine Task Queue?
• Celery
• Python Task
• Zeitgesteuerter Task
• Django Task
• Webhook
Warum eine
         Task Queue?

• Entkoppeln von Informationsproduzenten
  und -konsumenten
• Asynchrone Verarbeitung
• Skalierbarkeit
Task
Produzent           Konsument
            Queue
Produzent           Konsument




             Task
Produzent           Konsument
            Queue




Produzent           Konsument
Produzent           Konsument




             Task
Produzent           Konsument
            Queue




Produzent           Konsument
Produzent           Konsument




             Task
Produzent           Konsument
            Queue




Produzent           Konsument
Celery

• Autor: Ask Solem Hoel
• RabbitMQ, Stomp, Redis und Ghetto Queue
• Clustering mit RabbitMQ
• Parallele Ausführung
• Zeitgesteuerte Ausführung
Celery
• Rückgabewert sofort oder später
  verarbeiten
• Speichern der Rückgabe in „Result Stores“
• Webhooks
• Serialisierung (Pickle, JSON,YAML)
• Wiederholen abgebrochener Tasks
Celery
• Callbacks
• Task Sets
• Logging
• Bei Fehler E-Mail versenden
• Ausführliche Dokumentation
• BSD Lizenz
Celery Komponenten
• celeryd      • celerymon   • carrot
• celerybeat                 • anyjson
• celeryctl                  • SQLAlchemy
                              (optional)
• celeryev
• camqadm
Celery Installation

 $ pip install celery

 $ easy_install celery
Python Task
# Task als Klasse
from celery.task import Task
from myproject.models import User

class CreateUserTask(Task):
    def run(self, username, password):
        User.create(username, password)

>>> from tasks import CreateUserTask
>>> CreateUserTask().delay('john', 'secret')

# Task als Funktion mit Decorator
from celery.decorators import task
from myproject.models import User

@task
def create_user(username, password):
    User.create(username, password)

>>> from tasks import create_user
>>> create_user.delay('john', 'secret')
Python Task
@task() # Benutzt pickle, um das Objekt zu serialisieren.
def check_means(user):
    return user.has_means()

>>> from tasks import check_means
>>> result = check_means.delay(user)
>>> result.ready() # Gibt True zurück wenn der Task beendet ist.
False
>>> result.result # Task ist noch nicht beendet, kein Ergebnis verfügbar.
None
>>> result.get() # Warten bis der Task fertig ist und Ergebnis zurückgeben.
93.27
>>> result.result # Jetzt ist ein Ergebnis da.
93.27
>>> result.successful() # War der Task erfolgreich?
True
Python Task
          Konfiguration
# celeryconfig.py
BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "myuser"
BROKER_PASSWORD = "mypassword"
BROKER_VHOST = "myvhost"

CELERY_RESULT_BACKEND = "database"
CELERY_RESULT_DBURI = "mysql://user:password@host/dbname"

CELERY_IMPORTS = ("tasks", )




   $ celeryd --loglevel=INFO
Zeitgesteuerter Task
# Periodic task
from celery.decorators import periodic_task
from datetime import timedelta

@periodic_task(run_every=timedelta(seconds=30))
def every_30_seconds():
    print("Running periodic task!")

# crontab
from celery.task.schedules import crontab
from celery.decorators import periodic_task

@periodic_task(run_every=crontab(hour=7, minute=30, day_of_week=1))
def every_monday_morning():
    print("Execute every Monday at 7:30AM.")




                        $ celerybeat
                        $ celeryd -B
celeryev




 $ celeryev
Django Task
      Installation

$ pip install django-celery

$ easy_install django-celery
Django Task
Spamfilter
Django Task
                     Spamfilter

      Produzent


blog.views.add_comment
Django Task
                     Spamfilter

      Produzent


blog.views.add_comment




                         Comment
                          Model
Django Task
                       Spamfilter

      Produzent


blog.views.add_comment



      comment.save()
                          Comment
                           Model
Django Task
                       Spamfilter

                            Task
      Produzent            Queue


blog.views.add_comment



      comment.save()
                          Comment
                           Model
Django Task
                       Spamfilter

                            Task
      Produzent                           Konsument
                           Queue


blog.views.add_comment              blog.tasks.spam_filter



      comment.save()
                          Comment
                           Model
Django Task
                       Spamfilter
     blog.tasks.spam_filter.delay(comment.id,
         remote_addr)


                                 Task
      Produzent                                       Konsument
                                Queue


blog.views.add_comment                          blog.tasks.spam_filter



      comment.save()
                               Comment
                                Model
Django Task
                       Spamfilter
     blog.tasks.spam_filter.delay(comment.id,
         remote_addr)


                                 Task
      Produzent                                       Konsument
                                Queue


blog.views.add_comment                          blog.tasks.spam_filter



      comment.save()
                               Comment
                                Model
Django Task
                       Spamfilter
     blog.tasks.spam_filter.delay(comment.id,
         remote_addr)


                                 Task
      Produzent                                       Konsument
                                Queue


blog.views.add_comment                          blog.tasks.spam_filter


                                                 comment.is_spam = True
      comment.save()
                                                 comment.save()
                               Comment
                                Model
blog/tasks.py
@task
def spam_filter(comment_id, remote_addr=None, **kwargs):
        logger = spam_filter.get_logger(**kwargs)
        logger.info("Running spam filter for comment %s" % comment_id)

        comment = Comment.objects.get(pk=comment_id)
        current_domain = Site.objects.get_current().domain
        akismet = Akismet(settings.AKISMET_KEY, "http://%s" % domain)
        if not akismet.verify_key():
            raise ImproperlyConfigured("Invalid AKISMET_KEY")


        is_spam = akismet.comment_check(user_ip=remote_addr,
                            comment_content=comment.comment,
                            comment_author=comment.name,
                            comment_author_email=comment.email_address)
        if is_spam:
            comment.is_spam = True
            comment.save()

        return is_spam
Django Task
    Konfiguration
      # settings.py
      INSTALLED_APPS += ("djcelery", )
      import djcelery
      djcelery.setup_loader()

      BROKER_HOST = "localhost"
      BROKER_PORT = 5672
      BROKER_USER = "myuser"
      BROKER_PASSWORD = "mypassword"
      BROKER_VHOST = "myvhost"



$ python manage.py syncdb
$ python manage.py celeryd -l info
Django Admin Monitor




   $ python manage.py celerycam
                oder
           $ djcelerymon
Webhook
# POST
>>> from celery.task.http import URL
>>> res = URL("http://example.com/multiply").get_async(x=10, y=10)
>>> res.get() # {"status": "success", "retval": 100}
100

# GET
>>> from celery.task.http import HttpDispatchTask
>>> url = "http://example.com/multiply"
>>> res = HttpDispatchTask.delay(url, method="GET", x=10, y=10)
>>> res.get() # {"status": "success", "retval": 100}
100
Links

• http://celeryproject.org/
• http://github.com/ask
• http://pypi.python.org/pypi/celery
• http://pypi.python.org/pypi/django-celery
• http://pypi.python.org/pypi/celerymon
Lizenz
Dieses Werk ist unter einem Creative Commons
  Namensnennung-Weitergabe unter gleichen
   Bedingungen 3.0 Unported Lizenzvertrag
                   lizenziert.
  Um die Lizenz anzusehen, gehen Sie bitte zu
 http://creativecommons.org/licenses/by-sa/3.0/
    oder schicken Sie einen Brief an Creative
  Commons, 171 Second Street, Suite 300, San
         Francisco, California 94105, USA.

Weitere ähnliche Inhalte

Ähnlich wie Celery eine asynchrone task queue (nicht nur) für django

Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptSebastian Springer
 
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...GFU Cyrus AG
 
Enterprise Java Batch mit Spring
Enterprise Java Batch mit SpringEnterprise Java Batch mit Spring
Enterprise Java Batch mit Springdenschu
 
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsjavaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsgedoplan
 
Python builds mit ant
Python builds mit antPython builds mit ant
Python builds mit antroskakori
 
Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010Dirk Ginader
 
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?Marc Müller
 
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?Marc Müller
 
Angular von 0 auf 100
Angular von 0 auf 100Angular von 0 auf 100
Angular von 0 auf 100Yvette Teiken
 
Einführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungEinführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungDigicomp Academy AG
 
Domain Driven Design in Rails
Domain Driven Design in RailsDomain Driven Design in Rails
Domain Driven Design in RailsAngelo Maron
 
Prototype 1.7
Prototype 1.7Prototype 1.7
Prototype 1.7msebel
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPAmh0708
 
Django - The Web framework for perfectionists with deadlines
Django - The Web framework for perfectionists with deadlinesDjango - The Web framework for perfectionists with deadlines
Django - The Web framework for perfectionists with deadlinesMarkus Zapke-Gründemann
 
Automatisierte GUI-Tests mit Selenium
Automatisierte GUI-Tests mit SeleniumAutomatisierte GUI-Tests mit Selenium
Automatisierte GUI-Tests mit SeleniumBenjamin Schmid
 
Gwt Techtalk Präsentation
Gwt Techtalk PräsentationGwt Techtalk Präsentation
Gwt Techtalk Präsentationmlegenhausen
 
Unit testing mit Javascript
Unit testing mit JavascriptUnit testing mit Javascript
Unit testing mit Javascriptjoergreichert
 
Warum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtWarum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtSebastian Springer
 

Ähnlich wie Celery eine asynchrone task queue (nicht nur) für django (20)

Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScript
 
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
 
Enterprise Java Batch mit Spring
Enterprise Java Batch mit SpringEnterprise Java Batch mit Spring
Enterprise Java Batch mit Spring
 
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsjavaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
 
Python builds mit ant
Python builds mit antPython builds mit ant
Python builds mit ant
 
Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010
 
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?
 
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?
 
Angular von 0 auf 100
Angular von 0 auf 100Angular von 0 auf 100
Angular von 0 auf 100
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 
Einführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungEinführung in die funktionale Programmierung
Einführung in die funktionale Programmierung
 
Domain Driven Design in Rails
Domain Driven Design in RailsDomain Driven Design in Rails
Domain Driven Design in Rails
 
Prototype 1.7
Prototype 1.7Prototype 1.7
Prototype 1.7
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPA
 
node.js
node.jsnode.js
node.js
 
Django - The Web framework for perfectionists with deadlines
Django - The Web framework for perfectionists with deadlinesDjango - The Web framework for perfectionists with deadlines
Django - The Web framework for perfectionists with deadlines
 
Automatisierte GUI-Tests mit Selenium
Automatisierte GUI-Tests mit SeleniumAutomatisierte GUI-Tests mit Selenium
Automatisierte GUI-Tests mit Selenium
 
Gwt Techtalk Präsentation
Gwt Techtalk PräsentationGwt Techtalk Präsentation
Gwt Techtalk Präsentation
 
Unit testing mit Javascript
Unit testing mit JavascriptUnit testing mit Javascript
Unit testing mit Javascript
 
Warum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtWarum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser macht
 

Mehr von Markus Zapke-Gründemann

Writing multi-language documentation using Sphinx
Writing multi-language documentation using SphinxWriting multi-language documentation using Sphinx
Writing multi-language documentation using SphinxMarkus Zapke-Gründemann
 
Sichere Web-Applikationen am Beispiel von Django
Sichere Web-Applikationen am Beispiel von DjangoSichere Web-Applikationen am Beispiel von Django
Sichere Web-Applikationen am Beispiel von DjangoMarkus Zapke-Gründemann
 
Virtuelle Maschinen mit Packer, Vagrant und Salt bauen
Virtuelle Maschinen mit Packer, Vagrant und Salt bauenVirtuelle Maschinen mit Packer, Vagrant und Salt bauen
Virtuelle Maschinen mit Packer, Vagrant und Salt bauenMarkus Zapke-Gründemann
 
Writing multi-language documentation using Sphinx
Writing multi-language documentation using SphinxWriting multi-language documentation using Sphinx
Writing multi-language documentation using SphinxMarkus Zapke-Gründemann
 
Arbeiten mit distribute, pip und virtualenv
Arbeiten mit distribute, pip und virtualenvArbeiten mit distribute, pip und virtualenv
Arbeiten mit distribute, pip und virtualenvMarkus Zapke-Gründemann
 
Arbeiten mit distribute, pip und virtualenv
Arbeiten mit distribute, pip und virtualenvArbeiten mit distribute, pip und virtualenv
Arbeiten mit distribute, pip und virtualenvMarkus Zapke-Gründemann
 
Bottle - Python Web Microframework (english)
Bottle - Python Web Microframework (english)Bottle - Python Web Microframework (english)
Bottle - Python Web Microframework (english)Markus Zapke-Gründemann
 
Django - The Web framework for perfectionists with deadlines
Django - The Web framework  for perfectionists with deadlinesDjango - The Web framework  for perfectionists with deadlines
Django - The Web framework for perfectionists with deadlinesMarkus Zapke-Gründemann
 

Mehr von Markus Zapke-Gründemann (11)

Writing multi-language documentation using Sphinx
Writing multi-language documentation using SphinxWriting multi-language documentation using Sphinx
Writing multi-language documentation using Sphinx
 
Sichere Web-Applikationen am Beispiel von Django
Sichere Web-Applikationen am Beispiel von DjangoSichere Web-Applikationen am Beispiel von Django
Sichere Web-Applikationen am Beispiel von Django
 
Virtuelle Maschinen mit Packer, Vagrant und Salt bauen
Virtuelle Maschinen mit Packer, Vagrant und Salt bauenVirtuelle Maschinen mit Packer, Vagrant und Salt bauen
Virtuelle Maschinen mit Packer, Vagrant und Salt bauen
 
Writing multi-language documentation using Sphinx
Writing multi-language documentation using SphinxWriting multi-language documentation using Sphinx
Writing multi-language documentation using Sphinx
 
Mercurial
MercurialMercurial
Mercurial
 
Arbeiten mit distribute, pip und virtualenv
Arbeiten mit distribute, pip und virtualenvArbeiten mit distribute, pip und virtualenv
Arbeiten mit distribute, pip und virtualenv
 
Arbeiten mit distribute, pip und virtualenv
Arbeiten mit distribute, pip und virtualenvArbeiten mit distribute, pip und virtualenv
Arbeiten mit distribute, pip und virtualenv
 
Bottle - Python Web Microframework (english)
Bottle - Python Web Microframework (english)Bottle - Python Web Microframework (english)
Bottle - Python Web Microframework (english)
 
EuroDjangoCon 2009 - Ein Rückblick
EuroDjangoCon 2009 - Ein RückblickEuroDjangoCon 2009 - Ein Rückblick
EuroDjangoCon 2009 - Ein Rückblick
 
Bottle - Python Web Microframework
Bottle - Python Web MicroframeworkBottle - Python Web Microframework
Bottle - Python Web Microframework
 
Django - The Web framework for perfectionists with deadlines
Django - The Web framework  for perfectionists with deadlinesDjango - The Web framework  for perfectionists with deadlines
Django - The Web framework for perfectionists with deadlines
 

Celery eine asynchrone task queue (nicht nur) für django

  • 1. Celery Eine asynchrone Task Queue (nicht nur) für Django Markus Zapke-Gründemann www.keimlink.de Leipzig Python User Group 12.10.2010
  • 2. Überblick • Warum eine Task Queue? • Celery • Python Task • Zeitgesteuerter Task • Django Task • Webhook
  • 3. Warum eine Task Queue? • Entkoppeln von Informationsproduzenten und -konsumenten • Asynchrone Verarbeitung • Skalierbarkeit
  • 4. Task Produzent Konsument Queue
  • 5. Produzent Konsument Task Produzent Konsument Queue Produzent Konsument
  • 6. Produzent Konsument Task Produzent Konsument Queue Produzent Konsument
  • 7. Produzent Konsument Task Produzent Konsument Queue Produzent Konsument
  • 8. Celery • Autor: Ask Solem Hoel • RabbitMQ, Stomp, Redis und Ghetto Queue • Clustering mit RabbitMQ • Parallele Ausführung • Zeitgesteuerte Ausführung
  • 9. Celery • Rückgabewert sofort oder später verarbeiten • Speichern der Rückgabe in „Result Stores“ • Webhooks • Serialisierung (Pickle, JSON,YAML) • Wiederholen abgebrochener Tasks
  • 10. Celery • Callbacks • Task Sets • Logging • Bei Fehler E-Mail versenden • Ausführliche Dokumentation • BSD Lizenz
  • 11. Celery Komponenten • celeryd • celerymon • carrot • celerybeat • anyjson • celeryctl • SQLAlchemy (optional) • celeryev • camqadm
  • 12. Celery Installation $ pip install celery $ easy_install celery
  • 13. Python Task # Task als Klasse from celery.task import Task from myproject.models import User class CreateUserTask(Task): def run(self, username, password): User.create(username, password) >>> from tasks import CreateUserTask >>> CreateUserTask().delay('john', 'secret') # Task als Funktion mit Decorator from celery.decorators import task from myproject.models import User @task def create_user(username, password): User.create(username, password) >>> from tasks import create_user >>> create_user.delay('john', 'secret')
  • 14. Python Task @task() # Benutzt pickle, um das Objekt zu serialisieren. def check_means(user): return user.has_means() >>> from tasks import check_means >>> result = check_means.delay(user) >>> result.ready() # Gibt True zurück wenn der Task beendet ist. False >>> result.result # Task ist noch nicht beendet, kein Ergebnis verfügbar. None >>> result.get() # Warten bis der Task fertig ist und Ergebnis zurückgeben. 93.27 >>> result.result # Jetzt ist ein Ergebnis da. 93.27 >>> result.successful() # War der Task erfolgreich? True
  • 15. Python Task Konfiguration # celeryconfig.py BROKER_HOST = "localhost" BROKER_PORT = 5672 BROKER_USER = "myuser" BROKER_PASSWORD = "mypassword" BROKER_VHOST = "myvhost" CELERY_RESULT_BACKEND = "database" CELERY_RESULT_DBURI = "mysql://user:password@host/dbname" CELERY_IMPORTS = ("tasks", ) $ celeryd --loglevel=INFO
  • 16. Zeitgesteuerter Task # Periodic task from celery.decorators import periodic_task from datetime import timedelta @periodic_task(run_every=timedelta(seconds=30)) def every_30_seconds(): print("Running periodic task!") # crontab from celery.task.schedules import crontab from celery.decorators import periodic_task @periodic_task(run_every=crontab(hour=7, minute=30, day_of_week=1)) def every_monday_morning(): print("Execute every Monday at 7:30AM.") $ celerybeat $ celeryd -B
  • 18. Django Task Installation $ pip install django-celery $ easy_install django-celery
  • 20. Django Task Spamfilter Produzent blog.views.add_comment
  • 21. Django Task Spamfilter Produzent blog.views.add_comment Comment Model
  • 22. Django Task Spamfilter Produzent blog.views.add_comment comment.save() Comment Model
  • 23. Django Task Spamfilter Task Produzent Queue blog.views.add_comment comment.save() Comment Model
  • 24. Django Task Spamfilter Task Produzent Konsument Queue blog.views.add_comment blog.tasks.spam_filter comment.save() Comment Model
  • 25. Django Task Spamfilter blog.tasks.spam_filter.delay(comment.id, remote_addr) Task Produzent Konsument Queue blog.views.add_comment blog.tasks.spam_filter comment.save() Comment Model
  • 26. Django Task Spamfilter blog.tasks.spam_filter.delay(comment.id, remote_addr) Task Produzent Konsument Queue blog.views.add_comment blog.tasks.spam_filter comment.save() Comment Model
  • 27. Django Task Spamfilter blog.tasks.spam_filter.delay(comment.id, remote_addr) Task Produzent Konsument Queue blog.views.add_comment blog.tasks.spam_filter comment.is_spam = True comment.save() comment.save() Comment Model
  • 28. blog/tasks.py @task def spam_filter(comment_id, remote_addr=None, **kwargs): logger = spam_filter.get_logger(**kwargs) logger.info("Running spam filter for comment %s" % comment_id) comment = Comment.objects.get(pk=comment_id) current_domain = Site.objects.get_current().domain akismet = Akismet(settings.AKISMET_KEY, "http://%s" % domain) if not akismet.verify_key(): raise ImproperlyConfigured("Invalid AKISMET_KEY") is_spam = akismet.comment_check(user_ip=remote_addr, comment_content=comment.comment, comment_author=comment.name, comment_author_email=comment.email_address) if is_spam: comment.is_spam = True comment.save() return is_spam
  • 29. Django Task Konfiguration # settings.py INSTALLED_APPS += ("djcelery", ) import djcelery djcelery.setup_loader() BROKER_HOST = "localhost" BROKER_PORT = 5672 BROKER_USER = "myuser" BROKER_PASSWORD = "mypassword" BROKER_VHOST = "myvhost" $ python manage.py syncdb $ python manage.py celeryd -l info
  • 30. Django Admin Monitor $ python manage.py celerycam oder $ djcelerymon
  • 31. Webhook # POST >>> from celery.task.http import URL >>> res = URL("http://example.com/multiply").get_async(x=10, y=10) >>> res.get() # {"status": "success", "retval": 100} 100 # GET >>> from celery.task.http import HttpDispatchTask >>> url = "http://example.com/multiply" >>> res = HttpDispatchTask.delay(url, method="GET", x=10, y=10) >>> res.get() # {"status": "success", "retval": 100} 100
  • 32. Links • http://celeryproject.org/ • http://github.com/ask • http://pypi.python.org/pypi/celery • http://pypi.python.org/pypi/django-celery • http://pypi.python.org/pypi/celerymon
  • 33. Lizenz Dieses Werk ist unter einem Creative Commons Namensnennung-Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenzvertrag lizenziert. Um die Lizenz anzusehen, gehen Sie bitte zu http://creativecommons.org/licenses/by-sa/3.0/ oder schicken Sie einen Brief an Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA.